package org.jetlinks.community.mstn.annotation;

import java.lang.annotation.*;

/**
 * 资产管理
 * @author zhengzuowei
 */
@Target({ ElementType.TYPE ,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface MstnAssetsController {

    /**
     * 资产类型,类和方法上的注解不能同时为空
     */
    String type();

    /**
     * 方法参数中,资产ID对应的索引,从0开始. 通常用于 根据id进行某个操作时.比如:根据id查询,根据id修改
     */
    int assetIdIndex() default 0;

    /**
     * 方法参数中,资产对象的索引,默认为-1,表示不使用对象来进行租户相关控制,而使用assetIdIndex()来处理
     */
    int assetObjectIndex() default -1;

    /**
     * 在资产对象里表示资产ID的字段，默认值"id"
     */
    String property() default "id";

    /**
     * 要求当前用户必须是资产相关持有者,比如租户,机构等,当设置为true时,没有分配资产持有信息的用户将无法访问此功能，默认值false
     */
    boolean required() default false;

    /**
     * 是否自动绑定资产, 通用用于新增数据的时候将新增的实体类自动绑定到用户资产下，默认值false
     */
    boolean autoBind() default false;

    /**
     * 是否自动解绑, 通用用于删除数据的时候,将资产解绑 ，默认值false
     */
    boolean autoUnbind() default false;

    /**
     * boolean	是否解绑所有的资产,当删除数据时,解绑对应权限维度的资产。默认值true
     */
    boolean unbindAll() default true;

    /**
     * 忽略处理租户权限信息，默认值true
     */
    boolean ignore() default true;

    /**
     * 忽略处理动态查询条件，默认值false。 只有一个参数的情况。暂时只实现这种情况，即只有一个 QueryParamEntity 或者 Mono<QueryParamEntity>
     */
    boolean ignoreQuery() default false;


    /**
     * 当资产不存在时是否通过检查 ，默认值false
     */
    boolean allowAssetNotExist() default false;

    /**
     * 是否执行校验,通常用于新增数据的时候,设置为false则不校验传入的数据.默认值true
     */
    boolean validate() default true;


    /**
     * 控制数据操作权限,如果没有设置则只要有对应的资产就认为有权限
     */
    String[] permission() default {};


    /**
     * 当注解在方法上时，是否合并类上的注解，默认值true
     */
    boolean merge() default true;
}
